package com.example.d4_collection_set;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * LinkedHashSet源码分析
 */
@SuppressWarnings({"all"})
public class LinkedHashSetSource {
    public static void main(String[] args) {
        // 分析一下LinkedHashSet的底层机制
        Set set = new LinkedHashSet();
        set.add(new String("AA"));
        set.add(456);
        set.add(456);
        set.add(new Customer("刘", 1001));
        set.add(123);

        System.out.println("set=" + set);
        // 源码分析
        // 1.LinkedHashSet 加入顺序和取出元素/数据的顺序一致,因为LinkedHashSet在底层维护了一个双向链表+数组,因此可以保证数据取出的顺序保持一致
        // 2.LinkedHashSet 底层维护的是一个LinkedHashMap(是HashMap的子类)
        // 3.LinkedHashSet 底层结构 (数组table+双向链表)
        // 4.添加第一次时,直接将 数组table 扩容到 16 ,存放的结点类型是 LinkedHashMap$Entry
        // 5.数组是 HashMap$Node[] 存放的元素/数据是 LinkedHashMap$Entry类型
        /*
                // 继承关系是在内部类完成.
                static class Entry<K,V> extends HashMap.Node<K,V> {
                    Entry<K,V> before, after;
                    Entry(int hash, K key, V value, Node<K,V> next) {
                        super(hash, key, value, next);
                    }
                }

         */

    }
}

class Customer {
    private String name;
    private int no;

    public Customer(String name, int no) {
        this.name = name;
        this.no = no;
    }
}
